QuickOPC User's Guide and Reference
Writing value, timestamps and status code (OPC UA)
Development Models > Imperative Programming Model > Imperative Programming Model for OPC Data (Classic and UA) > Modifying Information (OPC Data) > Writing Attributes of OPC UA Nodes > Writing value, timestamps and status code (OPC UA)
In This Topic

Some OPC servers allow a combination of value, timestamps, and status code be written into their nodes (or to some nodes only). If you need to do this, call Write or WriteMultiple method.

A single node and attribute

.NET

// This example shows how to write data (a value, timestamps and status code) into a single attribute of a node.

using System;
using OpcLabs.EasyOpc.UA;
using OpcLabs.EasyOpc.UA.OperationModel;

namespace UADocExamples._EasyUAClient
{
    class Write
    {
        public static void Main1()
        {
            UAEndpointDescriptor endpointDescriptor =
                "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer";
            // or "http://opcua.demo-this.com:51211/UA/SampleServer" (currently not supported)
            // or "https://opcua.demo-this.com:51212/UA/SampleServer/"

            // Instantiate the client object.
            var client = new EasyUAClient();

            Console.WriteLine("Modifying data of a node's attribute...");
            try
            {
                client.Write(endpointDescriptor, "nsu=http://test.org/UA/Data/ ;i=10221",
                    new UAAttributeData(12345, UASeverity.GoodOrSuccess, DateTime.UtcNow));

                // The target server may not support this, and in such case a failure will occur.
            }
            catch (UAException uaException)
            {
                Console.WriteLine($"*** Failure: {uaException.GetBaseException().Message}");
                return;
            }

            Console.WriteLine("Finished.");
        }
    }
}
# This example shows how to write data (a value, timestamps and status code) into a single attribute of a node.

#requires -Version 5.1
using namespace OpcLabs.EasyOpc.UA
using namespace OpcLabs.EasyOpc.UA.OperationModel

# The path below assumes that the current directory is [ProductDir]/Examples-NET/PowerShell/Windows .
Add-Type -Path "../../../Components/Opclabs.QuickOpc/net472/OpcLabs.EasyOpcUA.dll"
Add-Type -Path "../../../Components/Opclabs.QuickOpc/net472/OpcLabs.EasyOpcUAComponents.dll"

[UAEndpointDescriptor]$endpointDescriptor =
    "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer"
# or "http://opcua.demo-this.com:51211/UA/SampleServer" (currently not supported)
# or "https://opcua.demo-this.com:51212/UA/SampleServer/"

# Instantiate the client object.
$client = New-Object EasyUAClient

Write-Host "Modifying data of a node's attribute..."
try {
    $client.Write($endpointDescriptor, "nsu=http://test.org/UA/Data/ ;i=10221", 
        (New-Object UAAttributeData(12345, [UASeverity]::GoodOrSuccess, [DateTime]::UtcNow)))

    # The target server may not support this, and in such case a failure will occur.
}
catch [UAException] {
    Write-Host "*** Failure: $($PSItem.Exception.GetBaseException().Message)"
    return
}

Write-Host "Finished."
# This example shows how to write data (a value, timestamps and status code) into a single attribute of a node.

# The QuickOPC package is needed. Install it using "pip install opclabs_quickopc".
import opclabs_quickopc

# Import .NET namespaces.
from System import *
from OpcLabs.EasyOpc.UA import *
from OpcLabs.EasyOpc.UA.OperationModel import *


endpointDescriptor = UAEndpointDescriptor('opc.tcp://opcua.demo-this.com:51210/UA/SampleServer')
# or 'http://opcua.demo-this.com:51211/UA/SampleServer' (currently not supported)
# or 'https://opcua.demo-this.com:51212/UA/SampleServer/'

# Instantiate the client object
client = EasyUAClient()

print("Modifying data of a node's attribute...")
try:
    IEasyUAClientExtension.Write(client,
        endpointDescriptor,
        UANodeDescriptor('nsu=http://test.org/UA/Data/ ;i=10221'),
        UAAttributeData(12345, UAStatusCode(UASeverity.GoodOrSuccess), DateTime.UtcNow))
except UAException as uaException:
    print('*** Failure: ' + uaException.GetBaseException().Message)
    exit()

print('Finished.')
' This example shows how to write data (a value, timestamps and status code) into a single attribute of a node.

Imports OpcLabs.EasyOpc.UA
Imports OpcLabs.EasyOpc.UA.OperationModel

Namespace _EasyUAClient
    Friend Class Write
        Public Shared Sub Main1()

            ' Define which server we will work with.
            Dim endpointDescriptor As UAEndpointDescriptor =
                    "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer"
            ' or "http://opcua.demo-this.com:51211/UA/SampleServer" (currently not supported)
            ' or "https://opcua.demo-this.com:51212/UA/SampleServer/"

            ' Instantiate the client object
            Dim client = New EasyUAClient()

            Try
                ' Modify data of a node's attribute
                client.Write(endpointDescriptor, "nsu=http://test.org/UA/Data/ ;i=10221",
                                   New UAAttributeData(12345, UASeverity.GoodOrSuccess, Date.UtcNow)) ' or "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer"

                ' The target server may not support this, and in such case a failure will occur.
            Catch uaException As UAException
                Console.WriteLine("*** Failure: {0}", uaException.GetBaseException().Message)
            End Try
        End Sub
    End Class
End Namespace

COM

// This example shows how to write data (a value, timestamps and status code)
// into a single attribute of a node.

class procedure Write.Main;
const
  GoodOrSuccess = 0;
var
  AttributeData: _UAAttributeData;
  Client: OpcLabs_EasyOpcUA_TLB._EasyUAClient;
  StatusCode: _UAStatusCode;
begin
  // Instantiate the client object
  Client := CoEasyUAClient.Create;

  // Modify data of a node's attribute
  StatusCode := CoUAStatusCode.Create;
  StatusCode.Severity := GoodOrSuccess;
  AttributeData := CoUAAttributeData.Create;
  AttributeData.Value := 12345;
  AttributeData.StatusCode := StatusCode;
  AttributeData.SourceTimestamp := Now;

  // Perform the operation
  try
    Client.Write(
      //'http://opcua.demo-this.com:51211/UA/SampleServer',
      //'https://opcua.demo-this.com:51212/UA/SampleServer/',
      'opc.tcp://opcua.demo-this.com:51210/UA/SampleServer',
      'nsu=http://test.org/UA/Data/ ;i=10221',
      AttributeData);
    // The target server may not support this, and in such case a failure will occur.
  except
    on E: EOleException do
    begin
      WriteLn(Format('*** Failure: %s', [E.GetBaseException.Message]));
      Exit;
    end;
  end;

end;
// This example shows how to write data (a value, timestamps and status code) into a single attribute of a node.

$GoodOrSuccess = 0;

// Instantiate the client object
$Client = new COM("OpcLabs.EasyOpc.UA.EasyUAClient");

// Modify data of a node's attribute
$StatusCode = new COM("OpcLabs.EasyOpc.UA.UAStatusCode");
$StatusCode->Severity = $GoodOrSuccess;
$AttributeData = new COM("OpcLabs.EasyOpc.UA.UAAttributeData");
$AttributeData->Value = 12345;
$AttributeData->StatusCode = $StatusCode;
$AttributeData->SourceTimestamp = (time() - 25569)/86400.0;

// Perform the operation
try
{
    $Client->Write(
        //"http://opcua.demo-this.com:51211/UA/SampleServer", 
        "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer", 
        "nsu=http://test.org/UA/Data/ ;i=10221", 
        $AttributeData);
    // The target server may not support this, and in such case a failure will occur.
}
catch (com_exception $e)
{
    printf("*** Failure: %s\n", $e->getMessage());
}
Rem This example shows how to write data (a value, timestamps and status code)
Rem into a single attribute of a node.

Public Sub Write_Main_Command_Click()
    OutputText = ""

    Const GoodOrSuccess = 0

    ' Instantiate the client object
    Dim Client As New EasyUAClient

    ' Modify data of a node's attribute
    Dim StatusCode As New UAStatusCode
    StatusCode.Severity = GoodOrSuccess
    Dim AttributeData As New UAAttributeData
    AttributeData.SetValue 12345
    Set AttributeData.StatusCode = StatusCode
    AttributeData.SourceTimestamp = Now()
    
    ' Perform the operation
    On Error Resume Next
    Call Client.Write("opc.tcp://opcua.demo-this.com:51210/UA/SampleServer", "nsu=http://test.org/UA/Data/ ;i=10221", AttributeData)
    If Err.Number <> 0 Then
        OutputText = OutputText & "*** Failure: " & Err.Source & ": " & Err.Description & vbCrLf
        Exit Sub
    End If
    On Error GoTo 0
End Sub
Rem This example shows how to write data (a value, timestamps and status code) into a single attribute of a node.

Option Explicit

Const GoodOrSuccess = 0

' Instantiate the client object
Dim Client: Set Client = CreateObject("OpcLabs.EasyOpc.UA.EasyUAClient")

' Modify data of a node's attribute
Dim StatusCode: Set StatusCode = CreateObject("OpcLabs.EasyOpc.UA.UAStatusCode")
StatusCode.Severity = GoodOrSuccess
Dim AttributeData: Set AttributeData = CreateObject("OpcLabs.EasyOpc.UA.UAAttributeData")
AttributeData.Value = 12345
AttributeData.StatusCode = StatusCode
AttributeData.SourceTimestamp = Now

' Perform the operation
On Error Resume Next
Client.Write "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer", "nsu=http://test.org/UA/Data/ ;i=10221", _
             AttributeData
' The target server may not support this, and in such case a failure will occur.
If Err.Number <> 0 Then
    WScript.Echo "*** Failure: " & Err.Source & ": " & Err.Description
    WScript.Quit
End If
On Error Goto 0

 

Multiple nodes or attributes

It is more efficient to use the WriteMultiple method, instead of several calls to the Write method.

.NET

// This example shows how to write data (a value, timestamps and status code) into 3 nodes at once, test for success of each 
// write and display the exception message in case of failure.

using System;
using OpcLabs.BaseLib.OperationModel;
using OpcLabs.EasyOpc.UA;
using OpcLabs.EasyOpc.UA.OperationModel;

namespace UADocExamples._EasyUAClient
{
    class WriteMultiple
    {
        public static void TestSuccess()
        {
            UAEndpointDescriptor endpointDescriptor =
                "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer";
            // or "http://opcua.demo-this.com:51211/UA/SampleServer" (currently not supported)
            // or "https://opcua.demo-this.com:51212/UA/SampleServer/"

            // Instantiate the client object
            var client = new EasyUAClient();

            // Modify data of nodes' attributes
            OperationResult[] operationResultArray = client.WriteMultiple(new[]
                {
                    new UAWriteArguments(endpointDescriptor, "nsu=http://test.org/UA/Data/ ;i=10221", 
                        new UAAttributeData(23456, UASeverity.GoodOrSuccess, DateTime.UtcNow)),
                    new UAWriteArguments(endpointDescriptor, "nsu=http://test.org/UA/Data/ ;i=10226", 
                        new UAAttributeData(2.34567890, UASeverity.GoodOrSuccess, DateTime.UtcNow)),
                    new UAWriteArguments(endpointDescriptor, "nsu=http://test.org/UA/Data/ ;i=10227", 
                        new UAAttributeData("ABC", UASeverity.GoodOrSuccess, DateTime.UtcNow))
                });

            // The target server may not support this, and in such case failures will occur.

            for (int i = 0; i < operationResultArray.Length; i++)
                if (operationResultArray[i].Succeeded)
                    Console.WriteLine("Result {0}: success", i);
                else
                    Console.WriteLine("Result {0}: {1}", i, operationResultArray[i].Exception.GetBaseException().Message);
        }
    }
}
# This example shows how to write data (a value, timestamps and status code) into 3 nodes at once, test for success of
# each write and display the exception message in case of failure.

# The QuickOPC package is needed. Install it using "pip install opclabs_quickopc".
import opclabs_quickopc

# Import .NET namespaces.
from System import *
from OpcLabs.EasyOpc.UA import *
from OpcLabs.EasyOpc.UA.OperationModel import *


endpointDescriptor = UAEndpointDescriptor('opc.tcp://opcua.demo-this.com:51210/UA/SampleServer')
# or 'http://opcua.demo-this.com:51211/UA/SampleServer' (currently not supported)
# or 'https://opcua.demo-this.com:51212/UA/SampleServer/'

# Instantiate the client object
client = EasyUAClient()

print("Modifying data of nodes' attributes...")
writeResultArray = client.WriteMultiple([
    UAWriteArguments(endpointDescriptor, UANodeDescriptor('nsu=http://test.org/UA/Data/ ;i=10221'),
                     UAAttributeData(23456, UAStatusCode(UASeverity.GoodOrSuccess), DateTime.UtcNow)),
    UAWriteArguments(endpointDescriptor, UANodeDescriptor('nsu=http://test.org/UA/Data/ ;i=10226'),
                     UAAttributeData(2.34567890, UAStatusCode(UASeverity.GoodOrSuccess), DateTime.UtcNow)),
    UAWriteArguments(endpointDescriptor, UANodeDescriptor('nsu=http://test.org/UA/Data/ ;i=10227'),
                     UAAttributeData('ABC', UAStatusCode(UASeverity.GoodOrSuccess), DateTime.UtcNow)),
    ])

# The target server may not support this, and in such case failures will occur.
for i, writeResult in enumerate(writeResultArray):
    if writeResult.Succeeded:
        print('writeResultArray[', i, ']: success', sep='')
    else:
        print('writeResultArray[', i, '] *** Failure: ', writeResult.Exception.GetBaseException().Message, sep='')

print()
print('Finished.')
' This example shows how to write data (a value, timestamps and status code) into 3 nodes at once, test for success of each 
' write and display the exception message in case of failure.

Imports System
Imports OpcLabs.BaseLib.OperationModel
Imports OpcLabs.EasyOpc.UA
Imports OpcLabs.EasyOpc.UA.OperationModel

Namespace _EasyUAClient
    Friend Class WriteMultiple
        Public Shared Sub TestSuccess()

            ' Define which server we will work with.
            Dim endpointDescriptor As UAEndpointDescriptor =
                    "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer"
            ' or "http://opcua.demo-this.com:51211/UA/SampleServer" (currently not supported)
            ' or "https://opcua.demo-this.com:51212/UA/SampleServer/"

            ' Instantiate the client object
            Dim client = New EasyUAClient()

            ' Modify data of nodes' attributes
            Dim operationResultArray() As OperationResult = client.WriteMultiple(New UAWriteArguments() _
              {
                  New UAWriteArguments(endpointDescriptor, "nsu=http://test.org/UA/Data/ ;i=10221",
                                       New UAAttributeData(23456, UASeverity.GoodOrSuccess, Date.UtcNow)),
                  New UAWriteArguments(endpointDescriptor, "nsu=http://test.org/UA/Data/ ;i=10226",
                                       New UAAttributeData(2.3456789, UASeverity.GoodOrSuccess, Date.UtcNow)),
                  New UAWriteArguments(endpointDescriptor, "nsu=http://test.org/UA/Data/ ;i=10227",
                                       New UAAttributeData("ABC", UASeverity.GoodOrSuccess, Date.UtcNow))
              }
            )

            ' The target server may not support this, and in such case failures will occur.

            For i As Integer = 0 To operationResultArray.Length - 1
                If operationResultArray(i).Succeeded Then
                    Console.WriteLine("Result {0}: success", i)
                Else
                    Console.WriteLine("Result {0}: {1}", i, operationResultArray(i).Exception.GetBaseException().Message)
                End If
            Next i
        End Sub
    End Class
End Namespace

COM

// This example shows how to write data (a value, timestamps and status code) into 3 nodes at once, test for success of each 
// write and display the exception message in case of failure.

$GoodOrSuccess = 0;

// Instantiate the client object
$Client = new COM("OpcLabs.EasyOpc.UA.EasyUAClient");

$StatusCode = new COM("OpcLabs.EasyOpc.UA.UAStatusCode");
$StatusCode->Severity = $GoodOrSuccess;

$WriteArguments1 = new COM("OpcLabs.EasyOpc.UA.OperationModel.UAWriteArguments");
$WriteArguments1->EndpointDescriptor->UrlString = 
    //"http://opcua.demo-this.com:51211/UA/SampleServer";
    //"https://opcua.demo-this.com:51212/UA/SampleServer/";
    "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer";
$WriteArguments1->NodeDescriptor->NodeId->ExpandedText = "nsu=http://test.org/UA/Data/ ;i=10221";
$AttributeData1 = new COM("OpcLabs.EasyOpc.UA.UAAttributeData");
$AttributeData1->Value = 23456;
$AttributeData1->StatusCode = $StatusCode;
$AttributeData1->SourceTimestamp = (time() - 25569)/86400.0;    // works in PHP v5.6, does not work in PHP 7.3.10
$WriteArguments1->AttributeData = $AttributeData1;

$WriteArguments2 = new COM("OpcLabs.EasyOpc.UA.OperationModel.UAWriteArguments");
$WriteArguments2->EndpointDescriptor->UrlString = 
    //"http://opcua.demo-this.com:51211/UA/SampleServer";
    //"https://opcua.demo-this.com:51212/UA/SampleServer/";
    "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer";
$WriteArguments2->NodeDescriptor->NodeId->ExpandedText = "nsu=http://test.org/UA/Data/ ;i=10226";
$AttributeData2 = new COM("OpcLabs.EasyOpc.UA.UAAttributeData");
$AttributeData2->Value = 2.3456789;
$AttributeData2->StatusCode = $StatusCode;
$AttributeData2->SourceTimestamp = (time() - 25569)/86400.0;    // works in PHP v5.6, does not work in PHP 7.3.10
$WriteArguments2->AttributeData = $AttributeData2;

$WriteArguments3 = new COM("OpcLabs.EasyOpc.UA.OperationModel.UAWriteArguments");
$WriteArguments3->EndpointDescriptor->UrlString = 
    //"http://opcua.demo-this.com:51211/UA/SampleServer";
    //"https://opcua.demo-this.com:51212/UA/SampleServer/";
    "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer";
$WriteArguments3->NodeDescriptor->NodeId->ExpandedText = "nsu=http://test.org/UA/Data/ ;i=10227";
$AttributeData3 = new COM("OpcLabs.EasyOpc.UA.UAAttributeData");
$AttributeData3->Value = "ABC";
$AttributeData3->StatusCode = $StatusCode;
$AttributeData3->SourceTimestamp = (time() - 25569)/86400.0;    // works in PHP v5.6, does not work in PHP 7.3.10
$WriteArguments3->AttributeData = $AttributeData3;

$arguments[0] = $WriteArguments1;
$arguments[1] = $WriteArguments2;
$arguments[2] = $WriteArguments3;

// Modify data of nodes' attributes
$results = $Client->WriteMultiple($arguments);

// Display results
for ($i = 0; $i < count($results); $i++)
{
    $WriteResult = $results[$i];
    // The target server may not support this, and in such case failures will occur.
    if ($WriteResult->Succeeded)
        printf("Result %d success\n", $i);
    else
        printf("Result d: s \n", $i, $WriteResult->Exception->GetBaseException()->Message);
}
Rem This example shows how to write data (a value, timestamps and status code) into 3 nodes at once, test for success of each 
Rem write and display the exception message in case of failure.

Option Explicit

Const GoodOrSuccess = 0

' Instantiate the client object
Dim Client: Set Client = CreateObject("OpcLabs.EasyOpc.UA.EasyUAClient")

Dim StatusCode: Set StatusCode = CreateObject("OpcLabs.EasyOpc.UA.UAStatusCode")
StatusCode.Severity = GoodOrSuccess

Dim WriteArguments1: Set WriteArguments1 = CreateObject("OpcLabs.EasyOpc.UA.OperationModel.UAWriteArguments")
WriteArguments1.EndpointDescriptor.UrlString = "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer"
WriteArguments1.NodeDescriptor.NodeId.ExpandedText = "nsu=http://test.org/UA/Data/ ;i=10221"
Dim AttributeData1: Set AttributeData1 = CreateObject("OpcLabs.EasyOpc.UA.UAAttributeData")
AttributeData1.Value = 23456
AttributeData1.StatusCode = StatusCode
AttributeData1.SourceTimestamp = Now
WriteArguments1.AttributeData = AttributeData1

Dim WriteArguments2: Set WriteArguments2 = CreateObject("OpcLabs.EasyOpc.UA.OperationModel.UAWriteArguments")
WriteArguments2.EndpointDescriptor.UrlString = "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer"
WriteArguments2.NodeDescriptor.NodeId.ExpandedText = "nsu=http://test.org/UA/Data/ ;i=10226"
Dim AttributeData2: Set AttributeData2 = CreateObject("OpcLabs.EasyOpc.UA.UAAttributeData")
AttributeData2.Value = 2.3456789
AttributeData2.StatusCode = StatusCode
AttributeData2.SourceTimestamp = Now
WriteArguments2.AttributeData = AttributeData2

Dim WriteArguments3: Set WriteArguments3 = CreateObject("OpcLabs.EasyOpc.UA.OperationModel.UAWriteArguments")
WriteArguments3.EndpointDescriptor.UrlString = "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer"
WriteArguments3.NodeDescriptor.NodeId.ExpandedText = "nsu=http://test.org/UA/Data/ ;i=10227"
Dim AttributeData3: Set AttributeData3 = CreateObject("OpcLabs.EasyOpc.UA.UAAttributeData")
AttributeData3.Value = "ABC"
AttributeData3.StatusCode = StatusCode
AttributeData3.SourceTimestamp = Now
WriteArguments3.AttributeData = AttributeData3

Dim arguments(2)
Set arguments(0) = WriteArguments1
Set arguments(1) = WriteArguments2
Set arguments(2) = WriteArguments3

' Modify data of nodes' attributes
Dim results: results = Client.WriteMultiple(arguments)

' Display results
Dim i: For i = LBound(results) To UBound(results)
    Dim WriteResult: Set WriteResult = results(i)
    ' The target server may not support this, and in such case failures will occur.
    If WriteResult.Succeeded Then
        WScript.Echo "Result " & i & " success"
    Else
        WScript.Echo "Result " & i & ": " & WriteResult.Exception.GetBaseException().Message
    End If
Next

 

 

See Also